/*
 * Copyright 2023 G42 Technologies Co.,Ltd.
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import { BasicCredentials } from "../auth/BasicCredentials";
import { ClientBuilder } from "../ClientBuilder";


function init() { }

describe('getInputParamCredential function', () => {

    it('should return an object with converted credential properties', () => {
        const client = new ClientBuilder(init);
        const input = {
            HUAWEICLOUD_SDK_AK: 'test-ak',
            HUAWEICLOUD_SDK_SK: 'test-sk',
            HUAWEICLOUD_SDK_DOMAIN_ID: 'test-domain-id',
            HUAWEICLOUD_SDK_PROJECT_ID: 'test-project-id'
        };
        const CredentialsType = new BasicCredentials();
        const result = client['getInputParamCredential'](CredentialsType, input);

        const expected = Object.assign(new BasicCredentials(), {
            ak: 'test-ak',
            sk: 'test-sk',
            projectId: 'test-project-id'
        });

        expect(result).toEqual(expected);
    });

    it('should not convert credential properties not starting with HUAWEICLOUD_SDK_', () => {
        const client = new ClientBuilder(init);
        const input = {
            HUAWEICLOUD_SDK_AK: 'test-ak',
            HUAWEICLOUD_SDK_SK: 'test-sk',
            HUAWEICLOUD_SDK_DOMAIN_ID: 'test-domain-id',
            HUAWEICLOUD_SDK_PROJECT_ID: 'test-project-id',
            otherProperty: 'test-value'
        };
        const CredentialsType = new BasicCredentials();
        const result = client['getInputParamCredential'](CredentialsType, input);
        expect(result).toEqual({
            ak: 'test-ak',
            sk: 'test-sk',
            projectId: 'test-project-id'
        });
    });
});

describe('getCredentialFromEnvironment', () => {
    let envBackup: any;

    beforeAll(() => {
        envBackup = process.env;
    });

    afterAll(() => {
        process.env = envBackup;
    });

    beforeEach(() => {
        process.env = {
            HUAWEICLOUD_SDK_AK: 'my_ak',
            HUAWEICLOUD_SDK_SK: 'my_sk',
            HUAWEICLOUD_SDK_PROJECT_ID: 'my_domain_id',
        };
    });

    it('should return the correct credential object', () => {
        const client = new ClientBuilder(init);
        const credential = client['getCredentialFromEnvironment']();

        const expected = Object.assign(new BasicCredentials(), {
            ak: 'my_ak',
            sk: 'my_sk',
            projectId: 'my_domain_id',
        });
        expect(credential).toEqual(expected);
    });
});